package org.budo.validation.validator.impl;

import java.lang.annotation.Annotation;
import java.util.Collection;
import java.util.Map;

import org.budo.support.dao.page.Page;
import org.budo.validation.exception.BudoNotEmptyValidationException;
import org.budo.validation.validator.BudoValidator;
import org.hibernate.validator.constraints.NotEmpty;

import lombok.extern.slf4j.Slf4j;

/**
 * @author lmw
 */
@Slf4j
public class NotEmptyValidator implements BudoValidator {
    @Override
    public void validate(Annotation annotation, Integer parameterIndex, String parameterName, Object argumentValue) {
        if (null == argumentValue) { // 不允许为空
            throw new BudoNotEmptyValidationException(parameterIndex, parameterName, (NotEmpty) annotation, argumentValue);
        }

        if (argumentValue instanceof String && ((String) argumentValue).isEmpty()) { // 无trim
            throw new BudoNotEmptyValidationException(parameterIndex, parameterName, (NotEmpty) annotation, argumentValue);
        } else if (argumentValue instanceof Map && ((Map) argumentValue).isEmpty()) {
            throw new BudoNotEmptyValidationException(parameterIndex, parameterName, (NotEmpty) annotation, argumentValue);
        } else if (argumentValue instanceof Collection && ((Collection) argumentValue).isEmpty()) {
            throw new BudoNotEmptyValidationException(parameterIndex, parameterName, (NotEmpty) annotation, argumentValue);
        } else if (argumentValue.getClass().isArray() && ((Object[]) argumentValue).length < 1) {
            throw new BudoNotEmptyValidationException(parameterIndex, parameterName, (NotEmpty) annotation, argumentValue);
        } else if (argumentValue instanceof Page) {
            Page page = (Page) argumentValue;
            if (null == page.getPageSize() && null == page.getPageNumber()) { // 空的Page对象
                throw new BudoNotEmptyValidationException(parameterIndex, parameterName, (NotEmpty) annotation, argumentValue);
            }
        } else {
            log.warn("#40 argumentValue.type=" + argumentValue.getClass().getName() + ", argumentValue=" + argumentValue);
        }
    }
}